home *** CD-ROM | disk | FTP | other *** search
/ Aminet 46 / Aminet 46 (2001)(GTI - Schatztruhe)[!][Dec 2001].iso / Aminet / text / edit / edt10src.lha / txt / ERexx.mod < prev    next >
Text File  |  1995-04-08  |  21KB  |  903 lines

  1. (*
  2.   .name       ERexx
  3.   .task       ARexx-Interface of Edt
  4.   .release    1.0
  5.   .language   Oberon-2
  6.   .translator Amiga Oberon 3.11
  7.   .system     AmigaOS 2.04/2.1/3.0
  8.   .author     Joachim Barheine
  9.   .address    Hochgrevestraße 3, D-38640 Goslar
  10.   .copyright  (c) 1994 by Joachim Barheine
  11. *)
  12.  
  13. (* .info: 29/09/94, 13:38:24, version 48 *)
  14.  
  15. MODULE ERexx;
  16.  
  17. IMPORT
  18.   SYS:= SYSTEM,
  19.  
  20.   ASCII,
  21.   AVL:= UntracedAVL,
  22.   Dos,
  23.   Err:= ErrCodes,
  24.   Exec,
  25.   GUI,
  26.   IO:= IOServer,
  27.   K:= Kernel,
  28.   Req:= ERequests,
  29.   Rexx,
  30.   Rx:= RexxSysLib,
  31.   S:= Strings,
  32.   Str:= StrPool;
  33.  
  34. CONST
  35.   true* = "1";
  36.   false* = "0";
  37.  
  38.   (* commands: *)
  39.   activateWindow*  = 0;
  40.   beginMacro*      = 1;
  41.   beginMark*       = 2;
  42.   bottom*          = 3;
  43.   busy*            = 4;
  44.   busyDone*        = 5;
  45.   closeAllFolds* = 6;
  46.   closeFold*     = 7;
  47.   compile*         = 8;
  48.   copy*            = 9;
  49.   cursorOff*       = 10;
  50.   cursorOn*        = 11;
  51.   cut*             = 12;
  52.   delBack*         = 13;
  53.   delete*          = 14;
  54.   delLines*        = 15;
  55.   displayBeep*     = 16;
  56.   displayOff*      = 17;
  57.   displayOn*       = 18;
  58.   displayPrefs*    = 19;
  59.   down*            = 20;
  60.   editPrefs*       = 21;
  61.   endMacro*        = 22;
  62.   endMark*         = 23;
  63.   enterRexx*       = 24;
  64.   erase*           = 25;
  65.   execRexx*        = 26;
  66.   execMacro*       = 27;
  67.   execute*         = 28;
  68.   find*            = 29;
  69.   first*           = 30;
  70.   firstError*   = 31;
  71.   firstText*       = 32;
  72.   firstWindow*     = 33;
  73.   forceAutosave*   = 34;
  74.   freeMacro*       = 35;
  75.   get*             = 36;
  76.   getASCII*        = 37;
  77.   getBookmark*     = 38;
  78.   gotoBookmark*    = 39;
  79.   gotoError*    = 40;
  80.   gotoLine*        = 41;
  81.   information*     = 42;
  82.   insASCII*        = 43;
  83.   insert*          = 44;
  84.   insertFile*      = 45;
  85.   item*            = 46;
  86.   last*            = 47;
  87.   lastChange*      = 48;
  88.   lastText*        = 49;
  89.   lastWindow*      = 50;
  90.   left*            = 51;
  91.   link*            = 52;
  92.   linkChanges*     = 53;
  93.   linkChangesDone* = 54;
  94.   loadErrors*   = 55;
  95.   make*            = 56;
  96.   matchBracket*    = 57;
  97.   menu*            = 58;
  98.   move*            = 59;
  99.   new*             = 60;
  100.   newFold*       = 61;
  101.   newWindow*       = 62;
  102.   nextError*    = 63;
  103.   nextText*        = 64;
  104.   nextWindow*      = 65;
  105.   open*            = 66;
  106.   openAllFolds*  = 67;
  107.   openFold*      = 68;
  108.   pageDown*        = 69;
  109.   pageUp*          = 70;
  110.   paste*           = 71;
  111.   prevError*    = 72;
  112.   prevText*        = 73;
  113.   prevWindow*      = 74;
  114.   print*           = 75;
  115.   printClip*       = 76;
  116.   quit*            = 77;
  117.   read*            = 78;
  118.   redo*            = 79;
  119.   redraw*          = 80;
  120.   repeatRexx*      = 81;
  121.   replace*         = 82;
  122.   reqAction*       = 83;
  123.   reqNumber*       = 84;
  124.   reqOptions*      = 85;
  125.   reqChoice*       = 86;
  126.   reqString*       = 87;
  127.   resolveAllFolds* = 88;
  128.   resolveFold*  = 89;
  129.   right*           = 90;
  130.   save*            = 91;
  131.   saveAs*          = 92;
  132.   saveClip*        = 93;
  133.   saveMacro*       = 94;
  134.   saveSettings*    = 95;
  135.   saveTemp*        = 96;
  136.   screenToBack*    = 97;
  137.   screenToFront*   = 98;
  138.   scrollDX*        = 99;
  139.   scrollDY*        = 100;
  140.   selectText*      = 101;
  141.   selectWindow*    = 102;
  142.   set*             = 103;
  143.   setBookmark*     = 104;
  144.   setKey*          = 105;
  145.   setWindowBox*    = 106;
  146.   shiftClip*       = 107;
  147.   subItem*         = 108;
  148.   title*           = 109;
  149.   toLower*         = 110;
  150.   top*             = 111;
  151.   toUpper*         = 112;
  152.   undo*            = 113;
  153.   unMark*          = 114;
  154.   up*              = 115;
  155.   windowToBack*    = 116;
  156.   windowToFront*   = 117;
  157.   wordBegin*       = 118;
  158.   wordEnd*         = 119;
  159.   wordLeft*        = 120;
  160.   wordRight*       = 121;
  161.  
  162.   (* variables: *)
  163.   vAutoIndent*   = 0;
  164.   vChanges*      = 1;
  165.   vCleanLines*   = 2;
  166.   vColumn*       = 3;
  167.   vFilename*     = 4;
  168.   vFindStr*      = 5;
  169.   vIcons*        = 6;
  170.   vInsert*       = 7;
  171.   vLength*       = 8;
  172.   vLine*         = 9;
  173.   vLineBegin*    = 10;
  174.   vLineEnd*      = 11;
  175.   vLineLen*      = 12;
  176.   vMargin*       = 13;
  177.   vMark*         = 14;
  178.   vMarkBegin*    = 15;
  179.   vMarkEnd*      = 16;
  180.   vName*         = 17;
  181.   vPath*         = 18;
  182.   vPosition*     = 19;
  183.   vRecording*    = 20;
  184.   vReplaceStr*   = 21;
  185.   vScreenHeight* = 22;
  186.   vScreenWidth*  = 23;
  187.   vSize*         = 24;
  188.   vTextID*       = 25;
  189.   vTexts*        = 26;
  190.   vWindowCols*   = 27;
  191.   vWindowID*     = 28;
  192.   vWindowLeft*   = 29;
  193.   vWindowLines*  = 30;
  194.   vWindowTop*    = 31;
  195.   vWindowHeight* = 32;
  196.   vWindows*      = 33;
  197.   vWindowWidth*  = 34;
  198.   vWordWrap*     = 35;
  199.  
  200.   (* keys: *)
  201.   kAlt*       = 0;
  202.   kAmiga*     = 1;
  203.   kBackspace* = 2;
  204.   kCtrl*      = 3;
  205.   kDel*       = 4;
  206.   kDown*      = 5;
  207.   kEnter*     = 6;
  208.   kEsc*       = 7;
  209.   kF1*        = 8;
  210.   kF2*        = 9;
  211.   kF3*        = 10;
  212.   kF4*        = 11;
  213.   kF5*        = 12;
  214.   kF6*        = 13;
  215.   kF7*        = 14;
  216.   kF8*        = 15;
  217.   kF9*        = 16;
  218.   kF10*       = 17;
  219.   kHelp*      = 18;
  220.   kLeft*      = 19;
  221.   kNumPad*    = 20;
  222.   kReturn*    = 21;
  223.   kRight*     = 22;
  224.   kShift*     = 23;
  225.   kSpace*     = 24;
  226.   kTab*       = 25;
  227.   kUp*        = 26;
  228.  
  229.   (* quick commands: *)
  230.   upStr*      = "UP";
  231.   downStr*    = "DOWN";
  232.   rightStr*   = "RIGHT";
  233.   leftStr*    = "LEFT";
  234.   moveR1Str*  = "MOVE 1";
  235.   moveL1Str*  = "MOVE (-1)";
  236.   undoStr*    = "UNDO";
  237.   redoStr*    = "REDO";
  238.   deleteStr*  = "DELETE";
  239.   delBackStr* = "DELBACK";
  240.  
  241. TYPE
  242.   Ident* = AVL.String;
  243.  
  244.   Node= UNTRACED POINTER TO NodeDesc;
  245.   NodeDesc= RECORD (AVL.SNode)
  246.     id: INTEGER;
  247.   END;
  248.  
  249. VAR
  250.   oldPos, pos: LONGINT;                   (* (prev.) parse position *)
  251.   cmdLine: Exec.LSTRPTR;
  252.   cmdStr: Ident;                  (* command name *)
  253.   cmds, keys, vars: AVL.SRoot;
  254.   msgCnt: INTEGER;    (* outstanding messages *)
  255.   quoted- : BOOLEAN;              (* token quoted? *)
  256.   rMsg: Rexx.RexxMsgPtr;
  257.   stdioDesc- : ARRAY 256 OF CHAR;
  258.   stdio- : Dos.FileHandlePtr;
  259.   missingArgs: BOOLEAN;
  260.  
  261. (* -- misc -- *)
  262. PROCEDURE ErrorMsg* (str: ARRAY OF CHAR);
  263.  
  264. (* $CopyArrays- *)
  265.  
  266. BEGIN
  267.   GUI.Flash;
  268.   IF Dos.Write(stdio, cmdStr, S.Length(cmdStr)) = 0 THEN END;
  269.   IF Dos.Write(stdio, ": ", 2) = 0 THEN END;
  270.   IF Dos.Write(stdio, str, S.Length(str)) = 0 THEN END;
  271.   IF Dos.Write(stdio, ":\n» ", 4) = 0 THEN END;
  272.   IF Dos.Write(stdio, cmdLine^, S.Length(cmdLine^)) = 0 THEN END;
  273.   IF Dos.Write(stdio, "\n\n", 2) = 0 THEN END;
  274. END ErrorMsg;
  275.  
  276. (* -- string pool -- *)
  277.  
  278. PROCEDURE New(VAR root: AVL.SRoot; name: ARRAY OF CHAR; id: INTEGER);
  279. VAR
  280.   n: Node;
  281.  
  282. (* $CopyArrays- *)
  283.  
  284. BEGIN
  285.   NEW(n);
  286.   COPY(name, n.name);
  287.   n.id:= id;
  288.   IF AVL.SAdd(root, n) THEN END;
  289. END New;
  290.  
  291. PROCEDURE DefineCmd(name: ARRAY OF CHAR; id: INTEGER);
  292.  
  293. (* $CopyArrays- *)
  294.  
  295. BEGIN
  296.   New(cmds, name, id);
  297. END DefineCmd;
  298.  
  299. PROCEDURE DefineVar(name: ARRAY OF CHAR; id: INTEGER);
  300.  
  301. (* $CopyArrays- *)
  302.  
  303. BEGIN
  304.   New(vars, name, id);
  305. END DefineVar;
  306.  
  307. PROCEDURE DefineKey(name: ARRAY OF CHAR; id: INTEGER);
  308.  
  309. (* $CopyArrays- *)
  310.  
  311. BEGIN
  312.   New(keys, name, id);
  313. END DefineKey;
  314.  
  315. PROCEDURE GetID(VAR id: INTEGER; VAR root: AVL.SRoot; name: Ident): BOOLEAN;
  316.  
  317. VAR
  318.   n: AVL.NodePtr;
  319.  
  320. (* $CopyArrays- *)
  321.  
  322. BEGIN
  323.   n:= AVL.SFind(root, name);
  324.   IF n # NIL THEN
  325.     id:= n(Node).id;
  326.     RETURN TRUE;
  327.   ELSE
  328.     RETURN FALSE;
  329.   END;
  330. END GetID;
  331.  
  332. (* -- parsing -- *)
  333.  
  334. PROCEDURE SkipBlanks;
  335.  
  336. BEGIN
  337.   WHILE cmdLine[pos] = " " DO INC(pos) END;
  338. END SkipBlanks;
  339.  
  340. (* get number at argument string position 'pos'; result: val is valid *)
  341. PROCEDURE GetNum* (VAR n: LONGINT): BOOLEAN;
  342.  
  343. VAR
  344.   e: SHORTINT;
  345.   brackets: BOOLEAN;
  346.  
  347.   PROCEDURE Skip;
  348.  
  349.   BEGIN
  350.     IF brackets & (cmdLine[pos] = ")") THEN INC(pos) END;
  351.     SkipBlanks;
  352.   END Skip;
  353.  
  354. BEGIN
  355.   oldPos:= pos;
  356.   brackets:= (cmdLine[pos] = "(");
  357.   IF brackets THEN INC(pos) END;
  358.   IF K.MatchIC(cmdLine^, pos, "-") THEN e:= -1 ELSE e:= 1 END;
  359.   IF K.ReadInt(cmdLine^, pos, n) THEN
  360.     n:= e * n;  (* set sign *)
  361.     Skip;
  362.     RETURN TRUE;
  363.   ELSE
  364.     Skip;
  365.     RETURN FALSE;
  366.   END;
  367. END GetNum;
  368.  
  369. PROCEDURE GetNumDef* (VAR num: LONGINT; def: LONGINT);
  370.  
  371. BEGIN
  372.   IF ~GetNum(num) THEN num:= def END;
  373. END GetNumDef;
  374.  
  375. PROCEDURE GetNumErr* (VAR num: LONGINT): BOOLEAN;
  376.  
  377. BEGIN
  378.   IF GetNum(num) THEN
  379.     RETURN TRUE;
  380.   ELSIF ~missingArgs THEN
  381.     ErrorMsg(Str.missingArgs^);
  382.     missingArgs:= TRUE;
  383.     RETURN FALSE;
  384.   END;
  385. END GetNumErr;
  386.  
  387. (* get string at argument string position 'pos'; result: str not empty *)
  388. PROCEDURE GetStr* (VAR str: ARRAY OF CHAR): BOOLEAN;
  389.  
  390. VAR
  391.   i: INTEGER;
  392.   qc: CHAR;
  393.  
  394.   PROCEDURE Get;
  395.  
  396.   BEGIN
  397.     WHILE (i < LEN(str) - 1)  & (cmdLine[pos] # qc) & (cmdLine[pos] # ASCII.nul) DO
  398.       str[i]:= cmdLine[pos];
  399.       INC(i); INC(pos);
  400.     END;
  401.   END Get;
  402.  
  403. BEGIN
  404.   oldPos:= pos;
  405.   IF cmdLine[pos] # ASCII.nul THEN
  406.     i:= 0;
  407.     quoted:= (cmdLine[pos] = '"') OR (cmdLine[pos] = "'") OR (cmdLine[pos] = "`");
  408.     IF quoted THEN
  409.       qc:= cmdLine[pos]; INC(pos);
  410.       Get;
  411.       IF cmdLine[pos] = qc THEN INC(pos) ELSE GUI.Flash END;
  412.     ELSE
  413.       qc:= " ";
  414.       Get;
  415.     END;
  416.     str[i]:= ASCII.nul;
  417.     SkipBlanks;
  418.     RETURN TRUE;
  419.   ELSE
  420.     RETURN FALSE;
  421.   END;
  422. END GetStr;
  423.  
  424. PROCEDURE GetStrDef* (VAR str: ARRAY OF CHAR; def: ARRAY OF CHAR);
  425.  
  426. (* $CopyArrays- *)
  427.  
  428. BEGIN
  429.   IF ~GetStr(str) THEN COPY(def, str) END;
  430. END GetStrDef;
  431.  
  432. PROCEDURE GetStrErr* (VAR str: ARRAY OF CHAR): BOOLEAN;
  433.  
  434. BEGIN
  435.   IF GetStr(str) THEN
  436.     RETURN TRUE;
  437.   ELSIF ~missingArgs THEN
  438.     ErrorMsg(Str.missingArgs^);
  439.     missingArgs:= TRUE;
  440.     RETURN FALSE;
  441.   END;
  442. END GetStrErr;
  443.  
  444. PROCEDURE GetStrLast* (VAR str: ARRAY OF CHAR): BOOLEAN;
  445.  
  446. VAR
  447.   len: LONGINT;
  448.  
  449. BEGIN
  450.   oldPos:= pos;
  451.   len:= S.Length(cmdLine^) - pos;
  452.   IF (cmdLine[pos] = "'") OR (cmdLine[pos] = '"') OR (cmdLine[pos] = "`") THEN
  453.     INC(pos); DEC(len, 2);  (* do not copy brackets *)
  454.   END;
  455.   IF (len > 0) & (len < LEN(str)) THEN
  456.     K.Copy(cmdLine^, pos, str, 0, len);
  457.     str[len]:= ASCII.nul;
  458.     RETURN TRUE;
  459.   ELSE
  460.     RETURN FALSE;
  461.   END;
  462. END GetStrLast;
  463.  
  464. PROCEDURE GetStrLastDef* (VAR str: ARRAY OF CHAR; def: ARRAY OF CHAR);
  465.  
  466. (* $CopyArrays- *)
  467.  
  468. BEGIN
  469.   IF ~GetStrLast(str) THEN COPY(def, str) END;
  470. END GetStrLastDef;
  471.  
  472. PROCEDURE GetStrLastErr* (VAR str: ARRAY OF CHAR): BOOLEAN;
  473.  
  474. BEGIN
  475.   IF GetStrLast(str) THEN
  476.     RETURN TRUE;
  477.   ELSIF ~missingArgs THEN
  478.     ErrorMsg(Str.missingArgs^);
  479.     missingArgs:= TRUE;
  480.     RETURN FALSE;
  481.   END;
  482. END GetStrLastErr;
  483.  
  484. PROCEDURE Match* (token: ARRAY OF CHAR): BOOLEAN;
  485.  
  486. (* $CopyArrays- *)
  487.  
  488. BEGIN
  489.   oldPos:= pos;
  490.   IF K.MatchIC(cmdLine^, pos, token) THEN
  491.     SkipBlanks;
  492.     RETURN TRUE;
  493.   ELSE
  494.     RETURN FALSE;
  495.   END;
  496. END Match;
  497.  
  498. (* reset index *)
  499. PROCEDURE UnGet*;
  500.  
  501. BEGIN
  502.   pos:= oldPos;
  503. END UnGet;
  504.  
  505. PROCEDURE More* (): BOOLEAN;
  506.  
  507. BEGIN
  508.   RETURN cmdLine[pos] # ASCII.nul;
  509. END More;
  510.  
  511. PROCEDURE GetCmdID* (VAR id: INTEGER): BOOLEAN;
  512.  
  513. VAR
  514.   i: INTEGER;
  515.  
  516. BEGIN
  517.   missingArgs:= FALSE;
  518.   SkipBlanks;
  519.   IF cmdLine[pos] # ASCII.nul THEN
  520.     i:= 0;
  521.     WHILE (i < LEN(cmdStr) - 1) & (cmdLine[pos] # ASCII.nul) & (cmdLine[pos] # " ") DO
  522.       cmdStr[i]:= CAP(cmdLine[pos]);
  523.       INC(i); INC(pos);
  524.     END;
  525.     cmdStr[i]:= ASCII.nul;
  526.     SkipBlanks;  (* get to first argument *)
  527.     RETURN GetID(id, cmds, cmdStr);
  528.   ELSE
  529.     rMsg.result1:= K.rcIllegal;
  530.     RETURN FALSE;
  531.   END;
  532. END GetCmdID;
  533.  
  534. PROCEDURE GetKeyID* (VAR id: INTEGER; name: Ident): BOOLEAN;
  535.  
  536. (* $CopyArrays- *)
  537.  
  538. BEGIN
  539.   RETURN GetID(id, keys, name);
  540. END GetKeyID;
  541.  
  542. PROCEDURE GetVarID* (VAR id: INTEGER): BOOLEAN;
  543.  
  544. VAR
  545.   name: AVL.String;
  546.  
  547. (* $CopyArrays- *)
  548.  
  549. BEGIN
  550.   IF GetStr(name) THEN
  551.     S.Upper(name);
  552.     RETURN GetID(id, vars, name);
  553.   ELSE
  554.     RETURN FALSE;
  555.   END;
  556. END GetVarID;
  557.  
  558. PROCEDURE GetVarIDErr* (VAR id: INTEGER): BOOLEAN;
  559.  
  560. BEGIN
  561.   IF GetVarID(id) THEN
  562.     RETURN TRUE;
  563.   ELSIF ~missingArgs THEN
  564.     ErrorMsg(Str.missingArgs^);
  565.     missingArgs:= TRUE;
  566.     RETURN FALSE;
  567.   END;
  568. END GetVarIDErr;
  569.  
  570. (* -- ARexx link -- *)
  571.  
  572. PROCEDURE SetResult* (str: ARRAY OF CHAR);
  573.  
  574. (* $CopyArrays- *)
  575.  
  576. BEGIN
  577.   IF Rexx.rxfResult IN Rexx.ActionFlags(rMsg.action) THEN
  578.     rMsg.result2:= Rx.CreateArgstring(str, S.Length(str));
  579.   END;
  580. END SetResult;
  581.  
  582. PROCEDURE SetBoolResult* (bool: BOOLEAN);
  583.  
  584. BEGIN
  585.   IF bool THEN SetResult(true) ELSE SetResult(false) END;
  586. END SetBoolResult;
  587.  
  588. PROCEDURE SetIntResult* (int: LONGINT);
  589.  
  590. VAR
  591.   str: ARRAY 20 OF CHAR;
  592.  
  593. BEGIN
  594.   K.IntToStr(str, int);
  595.   SetResult(str);
  596. END SetIntResult;
  597.  
  598. (* -- ARexx invocation -- *)
  599.  
  600. (* execute an ARexx command-file or -string; result: done? *)
  601. PROCEDURE Execute* (cmdStr: ARRAY OF CHAR; cmdFile: BOOLEAN): BOOLEAN;
  602.  
  603. VAR
  604.   cmd: Exec.LSTRPTR;
  605.   rMsg: Rexx.RexxMsgPtr;
  606.   rexx: Exec.MsgPortPtr;
  607.  
  608. (* $CopyArrays- *)
  609.  
  610. BEGIN
  611.   rMsg:= Rx.CreateRexxMsg(IO.rexxPort, "edt", IO.rexxPortName);
  612.   IF rMsg # NIL THEN
  613.     IF stdio # NIL THEN rMsg.stdin:= stdio; rMsg.stdout:= stdio END;
  614.     cmd:= Rx.CreateArgstring(cmdStr, S.Length(cmdStr));
  615.     IF cmd # NIL THEN
  616.       IF cmdFile THEN
  617.         rMsg.action:= Rexx.rxComm;
  618.       ELSE
  619.         rMsg.action:= Rexx.rxComm + Rexx.rxString;
  620.       END;
  621.       rMsg.args[0]:= cmd;
  622.       rMsg.node.node.name:= SYS.ADR(Rexx.rxsDir);
  623.       Exec.Forbid;
  624.       rexx:= Exec.FindPort(Rexx.rxsDir);
  625.       IF rexx # NIL THEN
  626.         Exec.PutMsg(rexx, rMsg);
  627.         INC(msgCnt);
  628.       END;
  629.       Exec.Permit;
  630.       IF rexx = NIL THEN
  631.         Req.ReqMessage(NIL, Str.noRexxPort^, Str.cancel^);
  632.       ELSE
  633.         RETURN TRUE;
  634.       END;
  635.       Rx.DeleteArgstring(cmd);
  636.     END;
  637.     Rx.DeleteRexxMsg(rMsg);
  638.   END;
  639.   RETURN FALSE;
  640. END Execute;
  641.  
  642. PROCEDURE GetMsg* (): BOOLEAN;
  643.  
  644. VAR
  645.   m: Exec.MessagePtr;
  646.  
  647. BEGIN
  648.   LOOP
  649.     m:= Exec.GetMsg(IO.rexxPort);
  650.     WHILE m = NIL DO
  651.       IF msgCnt <= 0 THEN
  652.         RETURN FALSE;
  653.       ELSE
  654.         Exec.WaitPort(IO.rexxPort);
  655.       END;
  656.       m:= Exec.GetMsg(IO.rexxPort)(Rexx.RexxMsg);  (* new trial *)
  657.     END;
  658.     rMsg:= m(Rexx.RexxMsg);
  659.     IF (rMsg.result1 = 0) & (rMsg.result2 # NIL) THEN
  660.       Rx.DeleteArgstring(rMsg.result2);
  661.     END;
  662.     IF rMsg.node.node.type # Exec.replyMsg THEN
  663.       rMsg.result1:= 0;
  664.       rMsg.result2:= 0;
  665.       cmdLine:= rMsg.args[0];
  666.       pos:= 0;
  667.       RETURN TRUE;
  668.     ELSE
  669.       Rx.DeleteArgstring(rMsg.args[0]);
  670.       Rx.DeleteRexxMsg(rMsg);
  671.       DEC(msgCnt);
  672.     END;
  673.   END;
  674. END GetMsg;
  675.  
  676. PROCEDURE ReplyMsg*;
  677.  
  678. BEGIN
  679.   Exec.ReplyMsg(rMsg);
  680. END ReplyMsg;
  681.  
  682. PROCEDURE OpenStdIO;
  683.  
  684. VAR
  685.   sName: ARRAY 128 OF CHAR;
  686.   a: ARRAY 1 OF LONGINT;
  687.  
  688. BEGIN
  689.   COPY(IO.screenName, sName);
  690.   a[0]:= SYS.ADR(sName);
  691.   K.FormatString(stdioDesc, Str.edtConsole^, a);
  692.   stdio:= Dos.Open(stdioDesc, Dos.oldFile);
  693.   K.Assert(stdio # NIL, Err.eRexxNoStdIO);
  694. END OpenStdIO;
  695.  
  696. BEGIN
  697.   OpenStdIO;
  698.  
  699.   (* commands: *)
  700.   AVL.SInit(cmds);
  701.   DefineCmd("ACTIVATEWINDOW", activateWindow);
  702.   DefineCmd("BEGINMACRO", beginMacro);
  703.   DefineCmd("BEGINMARK", beginMark);
  704.   DefineCmd("BOTTOM", bottom);
  705.   DefineCmd("BUSY", busy);
  706.   DefineCmd("BUSYDONE", busyDone);
  707.   DefineCmd("CLOSEALLFOLDS", closeAllFolds);
  708.   DefineCmd("CLOSEFOLD", closeFold);
  709.   DefineCmd("COPY", copy);
  710.   DefineCmd("CURSOROFF", cursorOff);
  711.   DefineCmd("CURSORON", cursorOn);
  712.   DefineCmd("CUT", cut);
  713.   DefineCmd("DELBACK", delBack);
  714.   DefineCmd("DELETE", delete);
  715.   DefineCmd("DELLINES", delLines);
  716.   DefineCmd("DISPLAYBEEP", displayBeep);
  717.   DefineCmd("DISPLAYOFF", displayOff);
  718.   DefineCmd("DISPLAYON", displayOn);
  719.   DefineCmd("DISPLAYPREFS", displayPrefs);
  720.   DefineCmd("DOWN", down);
  721.   DefineCmd("EDITPREFS", editPrefs);
  722.   DefineCmd("ENDMACRO", endMacro);
  723.   DefineCmd("ENDMARK", endMark);
  724.   DefineCmd("ENTERREXX", enterRexx);
  725.   DefineCmd("ERASE", erase);
  726.   DefineCmd("EXECMACRO", execMacro);
  727.   DefineCmd("EXECREXX", execRexx);
  728.   DefineCmd("FIND", find);
  729.   DefineCmd("FIRST", first);
  730.   DefineCmd("FIRSTTEXT", firstText);
  731.   DefineCmd("FIRSTWINDOW", firstWindow);
  732.   DefineCmd("FORCEAUTOSAVE", forceAutosave);
  733.   DefineCmd("FREEMACRO", freeMacro);
  734.   DefineCmd("GET", get);
  735.   DefineCmd("GETASCII", getASCII);
  736.   DefineCmd("GETBOOKMARK", getBookmark);
  737.   DefineCmd("GOTOLINE", gotoLine);
  738.   DefineCmd("GOTOBOOKMARK", gotoBookmark);
  739.   DefineCmd("INFORMATION", information);
  740.   DefineCmd("INSASCII", insASCII);
  741.   DefineCmd("INSERT", insert);
  742.   DefineCmd("INSERTFILE", insertFile);
  743.   DefineCmd("ITEM", item);
  744.   DefineCmd("LAST", last);
  745.   DefineCmd("LASTCHANGE", lastChange);
  746.   DefineCmd("LASTTEXT", lastText);
  747.   DefineCmd("LASTWINDOW", lastWindow);
  748.   DefineCmd("LEFT", left);
  749.   DefineCmd("LINKCHANGES", linkChanges);
  750.   DefineCmd("LINKCHANGESDONE", linkChangesDone);
  751.   DefineCmd("MATCHBRACKET", matchBracket);
  752.   DefineCmd("MENU", menu);
  753.   DefineCmd("MOVE", move);
  754.   DefineCmd("NEW", new);
  755.   DefineCmd("NEWFOLD", newFold);
  756.   DefineCmd("NEWWINDOW", newWindow);
  757.   DefineCmd("NEXTTEXT", nextText);
  758.   DefineCmd("NEXTWINDOW", nextWindow);
  759.   DefineCmd("OPEN", open);
  760.   DefineCmd("OPENALLFOLDS", openAllFolds);
  761.   DefineCmd("OPENFOLD", openFold);
  762.   DefineCmd("PAGEDOWN", pageDown);
  763.   DefineCmd("PAGEUP", pageUp);
  764.   DefineCmd("PASTE", paste);
  765.   DefineCmd("PREVTEXT", prevText);
  766.   DefineCmd("PREVWINDOW", prevWindow);
  767.   DefineCmd("PRINT", print);
  768.   DefineCmd("PRINTCLIP", printClip);
  769.   DefineCmd("QUIT", quit);
  770.   DefineCmd("READ", read);
  771.   DefineCmd("REDO", redo);
  772.   DefineCmd("REDRAW", redraw);
  773.   DefineCmd("REPEATREXX", repeatRexx);
  774.   DefineCmd("REPLACE", replace);
  775.   DefineCmd("REQACTION", reqAction);
  776.   DefineCmd("REQNUMBER", reqNumber);
  777.   DefineCmd("REQOPTIONS", reqOptions);
  778.   DefineCmd("REQCHOICE", reqChoice);
  779.   DefineCmd("REQSTRING", reqString);
  780.   DefineCmd("RESOLVEALLFOLDS", resolveAllFolds);
  781.   DefineCmd("RESOLVEFOLD", resolveFold);
  782.   DefineCmd("RIGHT", right);
  783.   DefineCmd("SAVE", save);
  784.   DefineCmd("SAVEAS", saveAs);
  785.   DefineCmd("SAVECLIP", saveClip);
  786.   DefineCmd("SAVEMACRO", saveMacro);
  787.   DefineCmd("SAVESETTINGS", saveSettings);
  788.   DefineCmd("SAVETEMP", saveTemp);
  789.   DefineCmd("SCREENTOBACK", screenToBack);
  790.   DefineCmd("SCREENTOFRONT", screenToFront);
  791.   DefineCmd("SCROLLDX", scrollDX);
  792.   DefineCmd("SCROLLDY", scrollDY);
  793.   DefineCmd("SELECTTEXT", selectText);
  794.   DefineCmd("SELECTWINDOW", selectWindow);
  795.   DefineCmd("SET", set);
  796.   DefineCmd("SETBOOKMARK", setBookmark);
  797.   DefineCmd("SETKEY", setKey);
  798.   DefineCmd("SETWINDOWBOX", setWindowBox);
  799.   DefineCmd("SHIFTCLIP", shiftClip);
  800.   DefineCmd("SUBITEM", subItem);
  801.   DefineCmd("TITLE", title);
  802.   DefineCmd("TOLOWER", toLower);
  803.   DefineCmd("TOP", top);
  804.   DefineCmd("TOUPPER", toUpper);
  805.   DefineCmd("UNDO", undo);
  806.   DefineCmd("UNMARK", unMark);
  807.   DefineCmd("UP", up);
  808.   DefineCmd("WINDOWTOBACK", windowToBack);
  809.   DefineCmd("WINDOWTOFRONT", windowToFront);
  810.   DefineCmd("WORDBEGIN", wordBegin);
  811.   DefineCmd("WORDEND", wordEnd);
  812.   DefineCmd("WORDLEFT", wordLeft);
  813.   DefineCmd("WORDRIGHT", wordRight);
  814.  
  815. (* $IF M2Amiga THEN *)
  816.   DefineCmd("COMPILE", compile);
  817.   DefineCmd("EXECUTE", execute);
  818.   DefineCmd("LINK", link);
  819.   DefineCmd("MAKE", make);
  820.   DefineCmd("FIRSTERROR", firstError);
  821.   DefineCmd("GOTOERROR", gotoError);
  822.   DefineCmd("LOADERRORS", loadErrors);
  823.   DefineCmd("NEXTERROR", nextError);
  824.   DefineCmd("PREVERROR", prevError);
  825. (* $END *)
  826.  
  827.   (* variables: *)
  828.   AVL.SInit(vars);
  829.   DefineVar("AUTOINDENT", vAutoIndent);
  830.   DefineVar("CHANGES", vChanges);
  831.   DefineVar("CLEANLINES", vCleanLines);
  832.   DefineVar("COLUMN", vColumn);
  833.   DefineVar("FILENAME", vFilename);
  834.   DefineVar("FINDSTR", vFindStr);
  835.   DefineVar("ICONS", vIcons);
  836.   DefineVar("INSERT", vInsert);
  837.   DefineVar("LENGTH", vLength);
  838.   DefineVar("LINE", vLine);
  839.   DefineVar("LINEBEGIN", vLineBegin);
  840.   DefineVar("LINEEND", vLineEnd);
  841.   DefineVar("LINELEN", vLineLen);
  842.   DefineVar("MARGIN", vMargin);
  843.   DefineVar("MARK", vMark);
  844.   DefineVar("MARKBEGIN", vMarkBegin);
  845.   DefineVar("MARKEND", vMarkEnd);
  846.   DefineVar("NAME", vName);
  847.   DefineVar("PATH", vPath);
  848.   DefineVar("POSITION", vPosition);
  849.   DefineVar("RECORDING", vRecording);
  850.   DefineVar("REPLACESTR", vReplaceStr);
  851.   DefineVar("SCREENHEIGHT", vScreenHeight);
  852.   DefineVar("SCREENWIDTH", vScreenWidth);
  853.   DefineVar("SIZE", vSize);
  854.   DefineVar("TEXTID", vTextID);
  855.   DefineVar("TEXTS", vTexts);
  856.   DefineVar("WINDOWCOLS", vWindowCols);
  857.   DefineVar("WINDOWHEIGHT", vWindowHeight);
  858.   DefineVar("WINDOWID", vWindowID);
  859.   DefineVar("WINDOWLEFT", vWindowLeft);
  860.   DefineVar("WINDOWLINES", vWindowLines);
  861.   DefineVar("WINDOWS", vWindows);
  862.   DefineVar("WINDOWTOP", vWindowTop);
  863.   DefineVar("WINDOWWIDTH", vWindowWidth);
  864.   DefineVar("WORDWRAP", vWordWrap);
  865.  
  866.   (* keys: *)
  867.   AVL.SInit(keys);
  868.   DefineKey("ALT", kAlt);
  869.   DefineKey("AMIGA", kAmiga);
  870.   DefineKey("BACKSPACE", kBackspace);
  871.   DefineKey("CTRL", kCtrl);
  872.   DefineKey("DEL", kDel);
  873.   DefineKey("DOWN", kDown);
  874.   DefineKey("ENTER", kEnter);
  875.   DefineKey("ESC", kEsc);
  876.   DefineKey("F1", kF1);
  877.   DefineKey("F2", kF2);
  878.   DefineKey("F3", kF3);
  879.   DefineKey("F4", kF4);
  880.   DefineKey("F5", kF5);
  881.   DefineKey("F6", kF6);
  882.   DefineKey("F7", kF7);
  883.   DefineKey("F8", kF8);
  884.   DefineKey("F9", kF9);
  885.   DefineKey("F10", kF10);
  886.   DefineKey("HELP", kHelp);
  887.   DefineKey("LEFT", kLeft);
  888.   DefineKey("NUMPAD", kNumPad);
  889.   DefineKey("RETURN", kReturn);
  890.   DefineKey("RIGHT", kRight);
  891.   DefineKey("SHIFT", kShift);
  892.   DefineKey("SPACE", kSpace);
  893.   DefineKey("TAB", kTab);
  894.   DefineKey("UP", kUp);
  895.  
  896.   msgCnt:= 0;
  897.   missingArgs:= FALSE;
  898.  
  899. CLOSE
  900.   IF stdio # NIL THEN
  901.     WHILE ~Dos.Close(stdio) DO Dos.Delay(25) END;
  902.   END;
  903. END ERexx.